package 尚硅谷.juc.test4;

/**
 * 单例模式：懒汉式
 */
public class SingletonDemo {

    /**
     * volatile的两大特性：变量可见性、防止指令重排。
     * 而这里使用volatile+synchronized就是用了volatile的防止指令重排和synchronized双端检锁机制
     * 因为指令不重排了，所以指令是顺序执行的，又因为加上了synchronized所以就会完全保证单例模式的线程安全问题
     */
    private static volatile SingletonDemo instance=null;

    private SingletonDemo(){
        System.out.println(Thread.currentThread().getName()+"执行无参构造");
    }

    /**
     * 使用synchronized双端检锁机制，多线程环境下解决了每个线程调用getInstance()方法都被synchronized锁住的问题
     * 只有instance为null的时候才会被synchronized锁住
     */
    public  static SingletonDemo getInstance(){
        if (instance==null){
            synchronized(SingletonDemo.class){
                if (instance==null){
                    instance=new SingletonDemo();
                }
            }

        }
        return instance;
    }

    public static void main(String[] args) {
        for (int i=0;i<100;i++){
            new Thread(()->{
                SingletonDemo.getInstance();
            }).start();
        }

    }
}
